#include <iostream>
using namespace std;

int main()
{
    int val = 0;
    // auto const_val_lambda = [=](){ val = 3; }; // wrong!!!

    auto mutable_val_lambda = [=]() mutable { val = 3; };
    mutable_val_lambda();
    cout << val << endl; // 0

    auto const_ref_lambda = [&]() { val = 4; };
    const_ref_lambda();
    cout << val << endl; // 4

    auto mutable_ref_lambda = [&]() mutable { val = 5; };
    mutable_ref_lambda();
    cout << val << endl; // 5

    return 0;
}

/* Lambda表达式中的mutable关键字的。
默认情况下，Lambda函数总是一个const函数，mutable可以取消其常量性。

按照规定，一个const的成员函数是不能在函数体内修改非静态成员变量的值。
例如上面的Lambda表达式可以看成以下仿函数代码： */

// class const_val_lambda
// {
// public:
//     const_val_lambda(int v) : val(v) {}
//     void operator()() const { val = 3; } // 常量成员函数
 
// private:
//     int val;
// };